﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using knfUpdateDataLayer.Aggiornamento;
using CalcoloTotali;
using knfUpdateDataLayer;
using System.Collections;


namespace ProceduraReportsConsole
{
    public class DatiNazione 
    {
        private List<RawData> _reporterGlassImport = new List<RawData>();
        private List<RawData> _reporterGlassExport = new List<RawData>();
        private List<RawData> _partnerGlass = new List<RawData>();


        private List<RawData> _reporterRockImport = new List<RawData>();
        private List<RawData> _reporterRockExport = new List<RawData>();
        private List<RawData> _partnerRock = new List<RawData>();

        public List<RawData> DatoReporterGlassImport 
        {
            get
            {
                return _reporterGlassImport;
            }
            set
            {
                _reporterGlassImport = value;
            }
        }

        public List<RawData> DatoReporterGlassExport
        {
            get
            {
                return _reporterGlassExport;
            }
            set
            {
                _reporterGlassExport = value;
            }
        }



        public List<RawData> DatoPartnerGlass
        {
            get
            {
                return _partnerGlass;
            }
            set
            {
                _partnerGlass = value;
            }
        }

        public List<RawData> DatoReporterRockImport
        {
            get
            {
                return _reporterRockImport;
            }
            set
            {
                _reporterRockImport = value;
            }
        }

        public List<RawData> DatoReporterRockExport
        {
            get
            {
                return _reporterRockExport;
            }
            set
            {
                _reporterRockExport = value;
            }
        }

        public List<RawData> DatoPartnerRock
        {
            get
            {
                return _partnerRock;
            }
            set
            {
                _partnerRock = value;
            }
        }
    }



    public class ProceduraTotali
    {
        private knfEntities _db = new knfEntities();

        private static int TrovaIndice(string country, List<String> listaInput)
        {
            int indicescelto = 0;
            int contatore = 0;

            foreach (string inputString in listaInput)
            {
                if (inputString == country)
                {
                    indicescelto = contatore;
                    break;
                }

                contatore += 1;

            }

            return indicescelto;

        }

        public void AggiornaTotaliPerAnno(int anno)
        {
            CancellaTotaliPerAnno(anno);

            Hashtable hashReporter = new Hashtable();

            List<string> ListaReporters = new List<string>();
            ListaReporters = EstraiListaReporters();

            List<DatiNazione> listaDatiNazione = new List<DatiNazione>();
            for (int i = 0; i < ListaReporters.Count; i++)
            {
                listaDatiNazione.Add(new DatiNazione());
            }

            List<RawData> listaTotaleAnnoScelto = new List<RawData>();
            listaTotaleAnnoScelto = EstraiTuttiRawDataPerAnnoScelto(anno);

            foreach (RawData tmpRawData in listaTotaleAnnoScelto)
            {
                // Troviamo Indice Reporter
                string tmpReporter = tmpRawData.REPORTER_LAB;

                int indiceReporter = TrovaIndice(tmpReporter, ListaReporters);

                // Troviamo Indice Reporter
                string tmpPartner = tmpRawData.PARTNER_LAB;

                int indicePartner = TrovaIndice(tmpPartner, ListaReporters);


                // Qui inseriamo il check Sul Prodotto
                if (tmpRawData.PRODUCT > 70000000)
                { 
                    // Siamo nel caso Glass Mineral Wool

                    if(tmpRawData.FLOW_LAB == "IMPORT")
                    {
                        listaDatiNazione[indiceReporter].DatoReporterGlassImport.Add(tmpRawData);
                    }

                    if (tmpRawData.FLOW_LAB == "EXPORT")
                    {
                        listaDatiNazione[indiceReporter].DatoReporterGlassExport.Add(tmpRawData);
                    }

                    if (indicePartner > 0)
                    {
                        listaDatiNazione[indicePartner].DatoPartnerGlass.Add(tmpRawData);
                    }

                
                }
                else if (tmpRawData.PRODUCT == 68061000)
                {
                    if (tmpRawData.FLOW_LAB == "IMPORT")
                    {
                        listaDatiNazione[indiceReporter].DatoReporterRockImport.Add(tmpRawData);
                    }

                    if (tmpRawData.FLOW_LAB == "EXPORT")
                    {
                        listaDatiNazione[indiceReporter].DatoReporterRockExport.Add(tmpRawData);
                    }

                    if (indicePartner > 0)
                    {
                        listaDatiNazione[indicePartner].DatoPartnerRock.Add(tmpRawData);
                    }

                }
            }

            int counterV = 0;
            foreach (string tmpReporter in ListaReporters)
            {
                hashReporter.Add(tmpReporter, listaDatiNazione[counterV]);

                counterV += 1;

            }

            foreach (string reporter in ListaReporters)
            {
                string messaggio = "Starting Reporter: " + reporter + ". Year: " + anno.ToString();

                ScriviNelDb("TOTALS", messaggio);

                List<RawData> ListaReporterAnnoSceltoGlassImport = new List<RawData>();
                List<RawData> ListaReporterAnnoSceltoGlassExport = new List<RawData>();
                List<RawData> ListaPartnerAnnoSceltoGlass = new List<RawData>();



                List<RawData> ListaReporterAnnoSceltoRockImport = new List<RawData>();
                List<RawData> ListaReporterAnnoSceltoRockExport = new List<RawData>();
                List<RawData> ListaPartnerAnnoSceltoRock = new List<RawData>();

                DatiNazione tmpDati = new DatiNazione();
                tmpDati = (DatiNazione)hashReporter[reporter];

                ListaReporterAnnoSceltoGlassImport = tmpDati.DatoReporterGlassImport;
                ListaReporterAnnoSceltoGlassExport = tmpDati.DatoReporterGlassExport;
                ListaPartnerAnnoSceltoGlass = tmpDati.DatoPartnerGlass;


                ListaReporterAnnoSceltoRockImport = tmpDati.DatoReporterRockImport;
                ListaReporterAnnoSceltoRockExport = tmpDati.DatoReporterRockExport;
                ListaPartnerAnnoSceltoRock = tmpDati.DatoPartnerRock;


                CalcoloReporter calculator = new CalcoloReporter(anno, reporter);
                calculator.Agisci(ListaReporterAnnoSceltoGlassImport, ListaPartnerAnnoSceltoGlass, "Glass Mineral Wool", "Ton", "IMPORT");
                calculator.Agisci(ListaReporterAnnoSceltoGlassExport, ListaPartnerAnnoSceltoGlass, "Glass Mineral Wool", "Ton", "EXPORT");
                calculator.Agisci(ListaReporterAnnoSceltoGlassImport, ListaPartnerAnnoSceltoGlass, "Glass Mineral Wool", "Euro", "IMPORT");
                calculator.Agisci(ListaReporterAnnoSceltoGlassExport, ListaPartnerAnnoSceltoGlass, "Glass Mineral Wool", "Euro", "EXPORT");
                calculator.Agisci(ListaReporterAnnoSceltoRockImport, ListaPartnerAnnoSceltoRock, "Rock Mineral Wool", "Ton", "IMPORT");
                calculator.Agisci(ListaReporterAnnoSceltoRockExport, ListaPartnerAnnoSceltoRock, "Rock Mineral Wool", "Ton", "EXPORT");
                calculator.Agisci(ListaReporterAnnoSceltoRockImport, ListaPartnerAnnoSceltoRock, "Rock Mineral Wool", "Euro","IMPORT");
                calculator.Agisci(ListaReporterAnnoSceltoRockExport, ListaPartnerAnnoSceltoRock, "Rock Mineral Wool", "Euro","EXPORT");

            }

            ScriviNelDb("TOTALS", "End Procedure");
        }


        private List<string> EstraiListaReporters()
        {
            List<string> outputList = new List<string>();

            var reporters = from p in _db.Reporters orderby p.Reporter select p.Reporter;

            outputList = reporters.ToList();

            reporters = null;

            return outputList;

        }


        private List<RawData> EstraiRawDataPerUnDatoReporter(List<RawData> inputList, string country)
        {
            List<RawData> datifinali = new List<RawData>();

            var reporter = from p in inputList where p.REPORTER_LAB == country select p;

            datifinali = reporter.ToList();
            reporter = null;

            return datifinali;

        }

        private List<RawData> EstraiRawDataPerUnDatoPartner(List<RawData> inputList, string country)
        {
            List<RawData> datifinali = new List<RawData>();

            var reporter = from p in inputList where p.PARTNER_LAB == country select p;

            datifinali = reporter.ToList();
            reporter = null;

            return datifinali;

        }




        private List<RawData> EstraiTuttiRawDataPerAnnoScelto(int anno)
        {
            List<RawData> listaTotaleAnnoScelto = new List<RawData>();
            var tuttiRawDataAnnoScelto = from p in _db.RawData where (p.PERIOD > anno * 100 & p.PERIOD < (anno + 1) * 100) select p;

            listaTotaleAnnoScelto = tuttiRawDataAnnoScelto.ToList();
            tuttiRawDataAnnoScelto = null;

            return listaTotaleAnnoScelto;
        }

        private static void ScriviNelDb(string section, string message)
        {
            ProceduraAggiornamento localProcedura = new ProceduraAggiornamento();
            localProcedura.ScriviNelDb(section, message);

            if (section == "ERROR" || section == "CLOSING")
            {
                localProcedura.ChiudiUltimaProceduraAperta();
            }

            localProcedura = null;
        }

        private void CancellaTotaliPerAnno(int anno)
        {
            // Query the database for the rows to be deleted.
            string annoString = anno.ToString();
            var deleteTotali = from totali in _db.Tabella_Totali where totali.Year == annoString select totali;

            _db.Configuration.AutoDetectChangesEnabled = false;

            foreach (Tabella_Totali totale in deleteTotali)
            {
                _db.Tabella_Totali.Remove(totale);
            }

            _db.SaveChanges();

            deleteTotali = null;
        }


    }
}
